package com.yang.utils;

import com.yang.domain.VO.MenuTreeVo;
import com.yang.domain.entity.Menu;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * @author Admin
 */
public class SystemConverter {


    public static List<MenuTreeVo> buildMenuSelectTree(List<Menu> menus) {

//        List<MenuTreeVo> menuTreeVos = new ArrayList<>();
//
//        //将menu转换为menuTreeVos类型
//        for (Menu menu : menus) {
//            menuTreeVos.add(new MenuTreeVo(menu.getId(),menu.getMenuName(),menu.getParentId(),null));
//        }
//
//        List<MenuTreeVo> options = new ArrayList<>();
//
//        //从menuTreeVos中找出父菜单开始构建树
//        for (MenuTreeVo menuTreeVo : menuTreeVos) {
//            //筛选出父级菜单进行构建
//            if (menuTreeVo.getParentId().equals(0L)){
//                //构建菜单树
//                menuTreeVo.setChildren(getChildList(menuTreeVos,menuTreeVo));
//            }
//
//        }

        List<MenuTreeVo> menuTreeVos = menus.stream()
                .map(m -> new MenuTreeVo(m.getId(), m.getMenuName(), m.getParentId(), null))
                .collect(Collectors.toList());

        List<MenuTreeVo> options = menuTreeVos.stream()
                .filter(o -> o.getParentId().equals(0L))
                .map(o -> o.setChildren(getChildList(menuTreeVos, o)))
                .collect(Collectors.toList());


        return options;
    }


    /**
     * 得到子节点列表，给子节点开始构建树
     */
    private static List<MenuTreeVo> getChildList(List<MenuTreeVo> list, MenuTreeVo option) {
/*
        List<MenuTreeVo> childList = new ArrayList<>();

        for (MenuTreeVo menuTreeVo : list) {
            //找出这个元素的子菜单
            if (menuTreeVo.getParentId().equals(option.getId())){
                //并且开始构建树
                menuTreeVo.setChildren(getChildList(list,menuTreeVo));
            }
        }
*/


        List<MenuTreeVo> options = list.stream()
                .filter(o -> Objects.equals(o.getParentId(), option.getId()))
                .map(o -> o.setChildren(getChildList(list, o)))
                .collect(Collectors.toList());

        return options;

    }
}
